// ++++++++++++++++++++++++++++++++++++++++
// 《零基础Go语言算法实战》源码
// ++++++++++++++++++++++++++++++++++++++++
// Author:廖显东（ShirDon）
// Blog:https://www.shirdon.com/
// Gitee:https://gitee.com/shirdonl/goAlgorithms.git
// Buy link :https://item.jd.com/14101229.html
// ++++++++++++++++++++++++++++++++++++++++

package main

import (
	"fmt"
	"math"
)

// 声明一个具有三个 float64 字段的 Point 结构体
type Point struct {
	X, Y, Z float64
}

// 使用三个点计算三角形的面积。
func TriangleArea(p1, p2, p3 Point) float64 {
	//使用距离公式计算每条边的长度
	a := math.Sqrt(math.Pow(p2.X-p1.X, 2) + math.Pow(p2.Y-p1.Y, 2) + math.Pow(p2.Z-p1.Z, 2))
	b := math.Sqrt(math.Pow(p3.X-p2.X, 2) + math.Pow(p3.Y-p2.Y, 2) + math.Pow(p3.Z-p2.Z, 2))
	c := math.Sqrt(math.Pow(p1.X-p3.X, 2) + math.Pow(p1.Y-p3.Y, 2) + math.Pow(p1.Z-p3.Z, 2))
	//计算半周长
	s := (a + b + c) / 2
	//使用海伦公式计算面积
	return math.Sqrt(s * (s - a) * (s - b) * (s - c))
}

func main() {
	//声明三个点
	p1 := Point{1, 1, 1}
	p2 := Point{4, 5, 6}
	p3 := Point{8, 8, 8}
	//使用 TriangleArea() 函数计算三角形的面积
	area := TriangleArea(p1, p2, p3)
	//打印
	fmt.Println(area)
}

//$ go run interview13-6.go
//8.573214099741163
